<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /**
     * 给你两个二进制字符串，返回它们的和（用二进制表示）。
     * 输入为 非空 字符串且只包含数字 1 和 0。
     * @param {string} a
     * @param {string} b
     * @return {string}
     */
    var addBinary = function(a, b) {
        // 补齐
        while(a.length > b.length){ b = "0"+b }
        while(b.length > a.length){ a = "0"+a }
        console.log(a,b)
        // 逐位加
        let add, sum=[] // 结果
        let carry = 0 // 进位 
        for(let i=a.length-1; i>=0; i--){
            add = parseInt(a[i]) + parseInt(b[i]) + carry
            if(add>=2){
                sum[i] = add-2
                carry=1
            }else{
                sum[i] = add
                carry = 0
            }
        }
        // 处理最后得进位
        if(carry == 1){ sum.unshift("1")}
        return sum.join("")
    };

    // 2 改进补齐方法

    var addBinary2 = function(a, b) {
        // 补齐
        a.length > b.length ? b = b.padStart(a.length,'0') : a = a.padStart(b.length,'0')
        console.log(a, b)
        // 逐位加
        let add, sum=[] // 结果
        let carry = 0 // 进位 
        for(let i=a.length-1; i>=0; i--){
          add = parseInt(a[i]) + parseInt(b[i]) + carry
          if(add>=2){
              sum[i] = add-2
              carry=1
          }else{
              sum[i] = add
              carry = 0
          }
        }
        // 处理最后得进位
        if(carry == 1){ sum.unshift("1") }
        return sum.join("")
    };
    // console.log(addBinary2("0","111"))

    // 3 不用先补齐

    var addBinary3 = function(a, b) {
        // 补齐
        // a.length > b.length ? b = b.padStart(a.length,'0') : a = a.padStart(b.length,'0')
        // console.log(a, b)

        // 逐位加
        let add, sum=[],x,y // 结果
        let carry = 0 // 进位 
        for(let i=a.length-1, j=b.length-1; i>=0 || j>=0; i--,j--){
          x = i<0 ? 0 : parseInt(a[i])
          y = j<0 ? 0 : parseInt(b[j])
          console.log(x,y )
          add = x + y + carry
          console.log(add)
          if(add>=2){
              sum.unshift(add-2)
              carry = 1
          }else{
              sum.unshift(add)
              carry = 0
          }
          console.log(sum)
        }
        // 处理最后得进位
        if(carry == 1){ sum.unshift("1") }
        return sum.join("")
    };
    console.log(addBinary3("0","111"))
  </script>
</body>
</html>